package cn.xf.common.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 时间格式化工具类
 * 
 * @author milaneuo
 */
public final class DateFormatUtils {
	
	/** 所有的formatter的存放map,预置为5个 */
	private static Map<String, SimpleDateFormat> formatters = new HashMap<String, SimpleDateFormat> (5);
	// 最常见的日期格式包括以下几种:yyyy-MM-dd HH:mm;yyyy-MM-dd;HH:mm;MM-dd-yyyy;yyyy年MM月dd日
	
	/**
	 * 转换字符串日期格式
	 */
	public static String parseStringDateFormat(String strDate, String format) throws ParseException {

		SimpleDateFormat instance = getInstance(format);
		Date date = instance.parse(strDate);
		return instance.format(date);
	}

	/**
	 * 转换日期格式
	 */	
	public static Date parseDateFormat(Date date, String format) throws ParseException {

		SimpleDateFormat instance = getInstance(format);
		String strDate = instance.format(date);
		return instance.parse(strDate);
	}
	
	/**
	 * 解析日期
	 * 
	 * @param value 待解析的字符串,如2011-10-24
	 * @param format 时间格式,如like "yyyy-MM-dd"
	 * 
	 * @return SimpleDateFormat
	 * @throws Date 
	 */
	public static Date parse(String value, String format) throws ParseException {
		
		return getInstance(format).parse(value);
	}
	
	/**
	 * 格式化日期
	 * 
	 * @param date 待格式化的日期
	 * @param format 时间格式,如like "yyyy-MM-dd"
	 * 
	 * @return String
	 */
	public static String format(Date date, String format) {
		
		return getInstance(format).format(date);
	}
	
	/**
	 * 获得SimpleDateFormat的实例
	 * 
	 * @param format 时间格式,如like "yyyy-MM-dd"
	 * 
	 * @return SimpleDateFormat
	 */
	@SuppressWarnings("unused")
	private static SimpleDateFormat getInstanceOld(String format) {
		initDataIfNecessary();
		SimpleDateFormat formatter = formatters.get(format);
		if (formatter == null) {
			formatter = new SimpleDateFormat(format);
			// formatters.put(format, formatter);
		}
		
		return formatter;
	}
	private static SimpleDateFormat getInstance(String format) {
		
		return new SimpleDateFormat(format);
	}
	
	/**
	 * 初始化数据
	 */
	private static void initDataIfNecessary() {
		if (formatters.isEmpty()) {
			formatters.put("yyyy-MM-dd", new SimpleDateFormat("yyyy-MM-dd"));
			formatters.put("yyyy-MM-dd HH:mm", new SimpleDateFormat("yyyy-MM-dd HH:mm"));
			formatters.put("HH:mm", new SimpleDateFormat("HH:mm"));
			formatters.put("MM-dd-yyyy", new SimpleDateFormat("MM-dd-yyyy"));
			formatters.put("yyyy年MM月dd日", new SimpleDateFormat("yyyy年MM月dd日"));
		}
	}
	
	private DateFormatUtils() {
		// prevents instantiation
	}
	
}